import {
  Column,
  CreateDateColumn,
  Entity, ManyToMany,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
  UpdateDateColumn
} from "typeorm";
import { MethodType, PermissionType } from "@/types";
import { Role } from "@/modules/role/entities/role.entity";

@Entity()
export class Permission {
  @PrimaryGeneratedColumn()
  id: number;

  // 权限名称
  @Column()
  permissionName: string;

  // 权限描述
  @Column()
  permissionDesc: string;

  // 权限编码
  @Column({ unique: true, length: 50 })
  permissionCode: string;

  // 权限类型
  @Column() // 菜单 、 路由 、 Api
  type: PermissionType;

  // 父级权限
  @ManyToOne(() => Permission, (permission) => permission.children, {
    createForeignKeyConstraints: false,
  })
  parent: Permission;

  // 子级权限，这个一般不在数据库中存储，只是为了方便查询
  @OneToMany(() => Permission, (permission) => permission.parent, {
    createForeignKeyConstraints: false,
  })
  children: Permission[];

  // 父级权限ID
  @Column({ nullable: true })
  parentId: number;

  // 请求路径
  @Column({ nullable: true })
  path: string;

  // redirect是路由重定向的意思
  @Column({ nullable: true })
  redirect: string;

  // 菜单Icon
  @Column({ nullable: true })
  icon: string;

  //关联组件
  @Column({ nullable: true })
  component: string;

  // 是否缓存
  @Column({ nullable: true })
  keepAlive: boolean;

  // 是否展示在页面菜单: 例如这个页面不在侧边栏展示，但是可以通过路由访问
  @Column({ default: true, comment: '是否展示在页面菜单' })
  isShow: boolean;

  // 是否为基础菜单：基础菜单不允许删除：无角色用户返回的菜单
  @Column({ default: false, comment: '是否为基础菜单' })
  isBase: boolean;

  // 请求方式
  @Column({ nullable: true })
  method: MethodType;

  // 权限状态
  @Column({ nullable: true, default: true })
  status: boolean;

  // 排序
  @Column({ nullable: true })
  sort: number;

  // 关联权限表
  @ManyToMany(() => Role, (Role) => Role.permissions, {
    createForeignKeyConstraints: false,
  })
  roles: Role[];
}
